import os
from flask import Flask, make_response, request
from flask_cors import CORS

# -------------------------- 1. 关键：导入所有业务模型（必须全部导入） --------------------------
# 导入用户模型（按实际路径调整，确保模型继承自 app.db 的 db.Model）
from app.Models.AdminModels.UserModels.UserModel import User
# 导入支出相关模型（一级分类、二级分类、支出主表）
from app.Models.FinanceModels.Expense import Expense
from app.Models.FinanceModels.ExpenseFirstCate import ExpenseFirstCate
from app.Models.FinanceModels.ExpenseSecondCate import ExpenseSecondCate
# 导入Todo模型（按实际路径调整）
from app.Models.Todo.TodoModel import Todo
# 导入目标管理模型
from app.Models.Goal.GoalModel import Goal
from app.Models.Goal.GoalCateModel import GoalCate
# 导入项目管理模型
from app.Models.Work.Program import Program
# ---------------------------------------------------------------------------------------------
# 导入运动模型
from app.Models.HealthModels.SportsCate import SportsCate
from app.Models.HealthModels.SportsRecord import SportsRecord
# 导入饮食模型
from app.Models.HealthModels.FoodModels.FoodCateModel import FoodCate
from app.Models.HealthModels.FoodModels.FoodCalModel import FoodCal
from app.Models.HealthModels.FoodModels.FoodRecordModel import FoodRecord
# 导入体重模型
from app.Models.HealthModels.WeightModels.WeightModel import Weight
# ---------------------------------------------------------------------------------------------

# 导入路由蓝图和db实例
from router_bp import ExpenseBP, ProgramBP, TodoBP, IncomeBP, FoodBP, UserBP, WeightBP, GoalBP
from app.db import db  # 从独立模块导入已初始化的db


def create_app():

    app = Flask(__name__)
    # 【关键】添加私有网络访问支持的中间件
    @app.after_request
    def add_private_network_header(response):
        response.headers['Access-Control-Allow-Private-Network'] = 'true'
        return response
    # -------------------------- 跨域配置（生产环境优化） --------------------------
    # 新增：初始化 CORS
    # 基础CORS配置
    CORS(
        app,
        supports_credentials=True,  # 允许携带凭证（Cookie）
        methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"],
        headers=["Content-Type", "Authorization"],
        max_age=86400  # 预检请求缓存24小时
    )

    # -------------------------- 文件上传配置 --------------------------
    # 文件上传存储的路径→用夸克网盘可以节省空间。
    # UPLOAD_FOLDER = r"D:\pic_bed" # 上传文件夹-windows
    UPLOAD_FOLDER = "/vol02/1000-1-ad24ac70/夸克网盘/VueSystemFiles/live_control_system/" # 这个是linux端口的。

    # 关键：自动创建目录（如果不存在），避免手动创建的麻烦
    os.makedirs(UPLOAD_FOLDER, exist_ok=True)

    # 配置FLASK
    app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
    app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024 * 1024  # 1GB（1024MB × 1024KB × 1024B）


        

    # 确保上传目录存在（添加异常捕获，避免权限问题）
    try:
        if not os.path.exists(UPLOAD_FOLDER):
            os.makedirs(UPLOAD_FOLDER, mode=0o755)  # 设置合理权限，防止恶意写入
    except OSError as e:
        raise RuntimeError(f"创建上传目录失败：{str(e)}") from e

    # -------------------------- 数据库配置 --------------------------
    # 从环境变量读取数据库配置（生产环境避免硬编码账号密码）

    app.config['SQLALCHEMY_DATABASE_URI'] = (
        f"mysql+pymysql://root:mysql_bhjbrr@192.168.1.86:3306/live_control_system"
    )
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 关闭不必要的修改跟踪
    app.config['SQLALCHEMY_POOL_RECYCLE'] = 300  # 连接池回收时间（避免MySQL超时断开）

    # -------------------------- 初始化组件与建表 --------------------------
    # 1. 绑定db到Flask应用
    db.init_app(app)
    # 3. 自动建表（核心：激活应用上下文 + 确保模型已导入）
    with app.app_context():
        try:
            # 创建所有已导入模型对应的表（仅表不存在时创建，不会覆盖已有表）
            db.create_all()
            print("✅ 数据表已装载完毕！")
        except Exception as e:
            # 捕获建表异常，便于排查问题（如数据库连接失败、SQL语法错误）
            raise RuntimeError(f"建表失败：{str(e)}") from e

    # 2. 注册路由蓝图（确保蓝图实例名与路由模块一致）
    app.register_blueprint(ExpenseBP.expense_bp)  # 支出蓝图
    app.register_blueprint(IncomeBP.income_bp)  # 收入蓝图
    app.register_blueprint(FoodBP.food_bp)  # 饮食管理
    app.register_blueprint(UserBP.user_bp)  # 用户蓝图
    app.register_blueprint(WeightBP.weight_bp)  # 体重蓝图
    app.register_blueprint(GoalBP.goal_bp)  # 体重蓝图
    app.register_blueprint(TodoBP.todo_bp)  # todo蓝图
    app.register_blueprint(ProgramBP.program_bp)  # 项目管理蓝图

    return app
